<?php

/**
 * Класс для работы с файлами
 */
class FilesController implements iFilesController {
	
	private static $aAllowedImages = array (1,2,3);
	private static $jpgCompress = 70;
	private static $aFiles = array();
	private static $aFolders = array();
	
	/**
	 * Получить объект файла
	 * @param string $path полный путь до файла
	 * @return File
	 */
	public static function getFile($path) {
		if (isset(self::$aFiles[$path])) {
			return self::$aFiles[$path];
		}
		
		return self::$aFiles[$path] = new File($path);
	}
	
	/**
	 * Получить объект каталога файлов
	 * @param string $path полный путь до каталога
	 * @return Folder
	 */
	public static function getFolder($path) {
		if (isset(self::$aFolders[$path])) {
			return self::$aFolders[$path];
		}
		
		return self::$aFolders[$path] = new Folder($path);
	}
	
	/**
	 * @param array $fieldValue
	 * @param Field $oField
	 * @return string
	 */
	public static function uploadImage (array $data, Field $oField) {
			
		$oIProfileType = TypesController::getInstance()->getTypeByName ('image_profile');
		if (!$oIProfile = ObjectsController::getInstance()->getObject ($oIProfileType, $oField->getAddId ())) {
			return '';
		}
		
		if (!$aInfo = getimagesize ($data['tmp_name'])) {
			return '';
		}
		
		if (!in_array ($aInfo[2], self::$aAllowedImages)) {
			return '';
		}
		
		$maxUploadSize = ((int) ini_get ('upload_max_filesize'))*1024*1024;
		
		if ($data['size'] > $maxUploadSize) {
			return '';
		}
		
		$key = explayHash (ExplaySession::getUserId() . time() . mt_rand(0,99)); // Возможна одновременная загрузка 100 файлов в секунду одним пользователем
		$sTempFilePath = DOC_ROOT . '/explay/temp/' . $key;
		
		if (!move_uploaded_file ($data['tmp_name'], $sTempFilePath)) {
			return '';
		}
		
		// Усё окей, можно двигаться дальше
		
		$associatedType = array (
			1 => 'gif',
			2 => 'jpg',
			3 => 'png'
		);
		
		$extension = $associatedType[$aInfo[2]];
		
		switch ($extension) {
			case 'gif' : {
				$thumbbase = imagecreatefromgif ($sTempFilePath);
				break;
			}
			case 'jpg' : {
				$thumbbase = imagecreatefromjpeg ($sTempFilePath);
				break;
			}
			case 'png' : {
				$thumbbase = imagecreatefrompng ($sTempFilePath);
				break;
			}
			default : {
				unlink ($sTempFilePath);
				throw new CoreException ('Epic fail :(');
			}
		}
		
		unlink ($sTempFilePath);
		
		$width = imagesx($thumbbase);
		$height = imagesy($thumbbase);
        
        $maxWidth = (int) $oIProfile->getValue ('max_width');
        $maxHeight = (int) $oIProfile->getValue ('max_height');
        
        if ($maxHeight == 0 || $maxWidth == 0) {
        	// Stupid admin
        	return '';
        }
		
        if ($width > $maxWidth || $height > $maxHeight) {
			$k = max($width/$maxWidth, $height/$maxHeight);
			$newWidth = intval($width / $k);
			$newHeight = intval($height / $k);
		} else {
			$newHeight = $height;
			$newWidth = $width;
		}
		
		$thumb = imagecreatetruecolor ($newWidth, $newHeight);
		imagecopyresampled ($thumb, $thumbbase, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        
		$sMainFilePath = '/images/' . ($oIProfile->getValue ('dir') ? $oIProfile->getValue ('dir') : 'uploads') . '/' . $key . '.' . $oIProfile->getValue('exit_type');
		
		switch ($oIProfile->getValue ('exit_type')) {
			case 'gif' : {
				if (!imagegif ($thumb, DOC_ROOT . $sMainFilePath)) {
					return '';
				}
				break;
			}
			case 'jpg' : {
				if (!imagejpeg($thumb, DOC_ROOT . $sMainFilePath, self::$jpgCompress)) {
					return '';
				}
				break;
			}
			case 'png' : {
				if (!imagepng ($thumb, DOC_ROOT . $sMainFilePath)) {
					return '';
				}
				break;
			}
		}
		
		imagedestroy ($thumb);
		imagedestroy ($thumbbase);
		
		return $sMainFilePath;
		
	}
	
	/**
	 * Загрузить файл
	 * @param array $data
	 * @param string $path новый путь до файла
	 * @param boolean $bDelete если файл с таким именем существует, то удалять/нет (true/false)
	 * @return boolean
	 */
	public static function uploadFile(array $data, $path, $bDelete = false) {
		if (!$bDelete && file_exists($path)) {
			return false;
		}
		
		$maxUploadSize = ((int) ini_get ('upload_max_filesize'))*1024*1024;
		
		if ($data['size'] > $maxUploadSize) {
			return false;
		}
		
		if (!move_uploaded_file ($data['tmp_name'], $path)) {
			return false;
		}
		
		return true;
	}
	
}